package com.sheng.leetcode.year2023.month11.day30;

import org.junit.Test;

import java.util.Arrays;

/**
 * @author by ls
 * @date 2023/11/30
 * <p>
 * 1657. 确定两个字符串是否接近<p>
 * <p>
 * 如果可以使用以下操作从一个字符串得到另一个字符串，则认为两个字符串 接近 ：<p>
 * 操作 1：交换任意两个 现有 字符。<p>
 * 例如，abcde -> aecdb<p>
 * 操作 2：将一个 现有 字符的每次出现转换为另一个 现有 字符，并对另一个字符执行相同的操作。<p>
 * 例如，aacabb -> bbcbaa（所有 a 转化为 b ，而所有的 b 转换为 a ）<p>
 * 你可以根据需要对任意一个字符串多次使用这两种操作。<p>
 * 给你两个字符串，word1 和 word2 。如果 word1 和 word2 接近 ，就返回 true ；否则，返回 false 。<p>
 * <p>
 * 示例 1：<p>
 * 输入：word1 = "abc", word2 = "bca"<p>
 * 输出：true<p>
 * 解释：2 次操作从 word1 获得 word2 。<p>
 * 执行操作 1："abc" -> "acb"<p>
 * 执行操作 1："acb" -> "bca"<p>
 * <p>
 * 示例 2：<p>
 * 输入：word1 = "a", word2 = "aa"<p>
 * 输出：false<p>
 * 解释：不管执行多少次操作，都无法从 word1 得到 word2 ，反之亦然。<p>
 * <p>
 * 示例 3：<p>
 * 输入：word1 = "cabbba", word2 = "abbccc"<p>
 * 输出：true<p>
 * 解释：3 次操作从 word1 获得 word2 。<p>
 * 执行操作 1："cabbba" -> "caabbb"<p>
 * 执行操作 2："caabbb" -> "baaccc"<p>
 * 执行操作 2："baaccc" -> "abbccc"<p>
 * <p>
 * 示例 4：<p>
 * 输入：word1 = "cabbba", word2 = "aabbss"<p>
 * 输出：false<p>
 * 解释：不管执行多少次操作，都无法从 word1 得到 word2 ，反之亦然。<p>
 * <p>
 * 提示：<p>
 * 1 <= word1.length, word2.length <= 10^5<p>
 * word1 和 word2 仅包含小写英文字母<p>
 */
public class LeetCode1657 {

    @Test
    public void test01() {
//        String word1 = "abc", word2 = "bca";
//        String word1 = "a", word2 = "aa";
        String word1 = "cabbba", word2 = "abbccc";
//        String word1 = "cabbba", word2 = "aabbss";
        System.out.println(new Solution().closeStrings(word1, word2));
    }
}

class Solution {
    public boolean closeStrings(String word1, String word2) {
        if (word1.length() != word2.length()) {
            return false;
        }
        // 首先两个字符串内，不同类型字符的数量要一致，其次，每种不同字符数量从小到大排序，两个应该一致
        int[] nums1 = new int[26], nums2 = new int[26];
        for (int i = 0; i < word1.length(); i++) {
            nums1[word1.charAt(i) - 'a']++;
            nums2[word2.charAt(i) - 'a']++;
        }
        int num1 = 0, num2 = 0;
        // 两个字符串中存在的元素种类必须一致
        for (int i = 0; i < nums1.length; i++) {
            if ((nums1[i] == 0 && nums2[i] > 0) || nums1[i] > 0 && nums2[i] == 0) {
                return false;
            }
            if (nums1[i] != 0) {
                num1++;
            }
            if (nums2[i] != 0) {
                num2++;
            }
        }
        Arrays.sort(nums1);
        Arrays.sort(nums2);
        return Arrays.equals(nums1, nums2);
    }
}
